package com.dkm.nettysocketdemo.myWebsite.service.impl;

import com.dkm.nettysocketdemo.WebSocket.WebSocketServer;
import com.dkm.nettysocketdemo.myWebsite.dao.HelmetGroupMapper;
import com.dkm.nettysocketdemo.myWebsite.dao.HelmetModMapper;
import com.dkm.nettysocketdemo.myWebsite.domain.HelmetGroup;
import com.dkm.nettysocketdemo.myWebsite.domain.HelmetMod;
import com.dkm.nettysocketdemo.myWebsite.service.HelmetModService;
import com.dkm.nettysocketdemo.untils.ClientVo;
import com.dkm.nettysocketdemo.untils.FileTools;
import com.dkm.nettysocketdemo.untils.GroupVo;
import com.dkm.nettysocketdemo.untils.HelmetVo;
import com.github.pagehelper.PageHelper;
import com.google.zxing.WriterException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 * @ClassName : HelmetModServiceImpl  //类名
 * @Description : 安全帽服务接口实现类  //描述
 * @Author : 易嵘  //作者
 * @Date: 2021-03-12 10:44  //时间
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class HelmetModServiceImpl implements HelmetModService {

    @Resource
    HelmetModMapper modMapper;

    @Resource
    HelmetGroupMapper groupMapper;
    @Resource
    FileTools fileTools;

    /**
     * 安全帽新增
     *
     * @param mod 安全帽对象
     * @return
     */
    @Override
    public int add(HelmetMod mod) {
        return modMapper.insertSelective(mod);
    }

    /**
     * 安全帽修改
     *
     * @param mod 安全帽
     * @return 回调函数
     */
    @Override
    public int update(HelmetMod mod) {
        return modMapper.updateByPrimaryKeySelective(mod);
    }

    /**
     * 安全帽id查询
     *
     * @param id 安全帽id
     * @return 安全帽
     */
    @Override
    public HelmetMod findById(String id) {
        return modMapper.findById(id);
    }

    /**
     * 根据客户id查询安全帽
     *
     * @param clientId 客户id
     * @return 客户集合（分组排序）
     */
    @Override
    public List<GroupVo> findAll(String clientId) {
        //新建返回模型集合
        List<GroupVo> groupVos = new LinkedList<>();
        //根据客户id查询分组
        List<HelmetGroup> groups = groupMapper.findClientId(clientId);
        //根据客户id查询安全帽
        List<HelmetMod> mods = modMapper.findClientId(clientId);
        //新建默认分组
        GroupVo groupVo = new GroupVo();
        //设置默认分组名称
        groupVo.setName("未分组安全帽");
        //循环所有安全帽
        for (HelmetMod helmetMod : mods) {
            //判断是否为未分组安全帽
            if (helmetMod.getGroupId() == null) {
                //新建安全帽VO模型
                HelmetVo helmetVo = new HelmetVo();
                //设置安全帽名称
                helmetVo.setName(helmetMod.getHelmetName());
                //设置安全帽id
                helmetVo.setSerial(helmetMod.getPkHelmetId());
                //设置安全帽状态（在线，离线）
                helmetVo.setState(WebSocketServer.isOnLine(helmetMod.getPkHelmetId()));
                //将安全帽加入默认分组
                groupVo.getArr().add(helmetVo);
                //移除该安全帽
                //mods.remove(helmetMod);
            }
        }
        //判断该分组是否有安全帽
        if (groupVo.getArr().size() > 0) {
            //设置分组在线人数
            getState(groupVos, groupVo);
        }
        //循环所有分组
        for (HelmetGroup group : groups) {
            //新建分组VO
            GroupVo groupVo1 = new GroupVo();
            //设置分组名称
            groupVo1.setName(group.getGroupName());
            //循环拥有分组的模型
            for (HelmetMod helmetMod : mods) {
                //判断分组id是否相同
                if (helmetMod.getGroupId() != null && helmetMod.getGroupId().equals(group.getPkGroupId())) {
                    //新建安全帽VO模型
                    HelmetVo helmetVo = new HelmetVo();
                    //设置安全帽名称
                    helmetVo.setName(helmetMod.getHelmetName());
                    //设置安全帽id
                    helmetVo.setSerial(helmetMod.getPkHelmetId());
                    //设置安全帽是否在线
                    helmetVo.setState(WebSocketServer.isOnLine(helmetMod.getPkHelmetId()));
                    //加入到分组VO模型
                    groupVo1.getArr().add(helmetVo);
                }
            }
            //设置该分组在线人数
            getState(groupVos, groupVo1);
        }
        return groupVos;
    }

    /**
     * 用户绑定安全帽
     *
     * @param clientId 用户id
     * @param helmetId 安全帽id
     * @return 回调函数
     */
    @Override
    public int bindingHelmet(String clientId, String helmetId) {
        HelmetMod mod = new HelmetMod();
        mod.setPkHelmetId(helmetId);
        mod.setClientId(clientId);
        return modMapper.updateByPrimaryKeySelective(mod);
    }

    /**
     * 生成安全帽二维码
     *
     * @param pkHelmetId 安全帽id
     * @return 二维码地址
     */
    @Override
    public String getHelmetQR(String pkHelmetId) {
        String path = null;
        try {
            path = fileTools.generateQRCodeImage("helmet_" + pkHelmetId, 600, 600, "helmet");
            HelmetMod mod = new HelmetMod();
            mod.setHelmetQr(path);
            mod.setPkHelmetId(pkHelmetId);
            int row = modMapper.updateByPrimaryKeySelective(mod);
            if (row > 0) {
                mod = null;
                System.gc();
            }
        } catch (IOException | WriterException e) {
            e.printStackTrace();
        }
        return path;
    }

    @Override
    public List<HelmetMod> selectAll(String startTime, String endTime, Integer page, Integer limit, HelmetMod helmetMod) {
        PageHelper.startPage(page, limit);
        return modMapper.findAll(startTime, endTime, helmetMod);
    }

    @Override
    public Integer rowCount(String startTime, String endTime, HelmetMod helmetMod) {
        return modMapper.rowCount(startTime, endTime, helmetMod);
    }

    /**
     * 更新
     *
     * @param pkHelmetId 安全帽id
     * @return 回调函数
     */
    @Override
    public int updateById(String pkHelmetId, String isRevison) {
        return modMapper.updateById(pkHelmetId, isRevison, new Date());
    }

    @Override
    public int updateAll(List<String> pkHelmetIds, String name) {
        return modMapper.updateAll(pkHelmetIds, name, new Date());
    }

    @Override
    public List<HelmetMod> findByNull() {
        return modMapper.findByNull(null);
    }

    /**
     * 查询这个用户所有的帽子
     * @param clientId
     * @return
     */
    @Override
    public List<ClientVo> findByIds(String clientId) {
        //　查询所有的安全帽
        List<HelmetMod> byNull = modMapper.findByNull(clientId);
        //　查询所拥有的安全帽
        List<HelmetMod> mapperClientId = modMapper.findClientId(clientId);

        List<ClientVo> list = new ArrayList<>();
        for (HelmetMod helmetMod : byNull) {
            ClientVo clientVo = new ClientVo();
            for (HelmetMod mod : mapperClientId) {
                if (helmetMod.getPkHelmetId().equals(mod.getPkHelmetId())){
                    clientVo.setSelected(true);
                }
            }
                clientVo.setValue(helmetMod.getPkHelmetId());
                clientVo.setName(helmetMod.getPkHelmetId());
            list.add(clientVo);
        }

        return list;
    }

    @Override
    public String audioFile(MultipartFile file){
        String path=null;
        try {
             path= fileTools.saveFile("audio",file);
            System.out.println(path+"录音地址");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return path;
    }


    /**
     * 设置分组在线人数
     *
     * @param groupVos 分组总模型
     * @param groupVo  需要设置在线人数的分组模型
     */
    private void getState(List<GroupVo> groupVos, GroupVo groupVo) {
        int row = 0;
        //循环安全帽
        for (HelmetVo helmetVo : groupVo.getArr()) {
            //判断是否在线
            if (helmetVo.getState()) {
                row++;
            }
        }
        //设置在线人数
        groupVo.setOnline(row);
        groupVos.add(groupVo);
    }

}
